import pickle
'''
需求：
实现通讯录的中联系人的增删改查
经分析还需要菜单、退出、主控函数；
联系人用字典来存储
'''
'''
遇到的问题及解决方法：
1.选项是字符串而不是整型(int转换)
2.完成一项工作后直接退出了（增加循环来实现）
3.内部退出系统（break）
4.冗余的判断（continue）
5.输入异常ValueError的处理（try except ）
6.查询、删除、修改不存在的联系人，添加重复联系人（name in ab）
7.程序重启后数据丢失（保存到文件，后面从文件中读取,添加保存和加载方法）
8.TypeError: write() argument must be str, not bytes(用二进制方式打开就没有问题)
9.增加查看所有人信息的功能
10.加载后字典不为空，离开加载函数后字典为空（global ab）
'''

ab = {}


def add():
    name = input('请输入姓名')
    if name not in ab:
        ab[name]=input('请输入电话号码')
        print('添加成功!')
    else:
        print('此人已存在')


def delete():
    name = input('请输入删除人的姓名')
    if name in ab:
        del ab[name]
        print('删除成功!')
    else:
        print('此人不存在')


def modify():
    name = input('请输入被修改人的姓名')
    if name in ab:
        ab[name]=input('请输入被修改人的新电话')
        print('修改成功!')
    else:
        print('此人不存在')


def search1():
    name = input('请输入被查询人的姓名')
    if name in ab:
        print('{0}的电话号码是{1}'.format(name,ab[name]))
        print('查询成功!')
    else:
        print('不存在此人')


def search():
    name = input('请输入被查询人的姓名')
    flag = False
    for nm in ab.keys():
        if nm.find(name)!=-1:
            print('{0}的电话号码是{1}'.format(nm, ab[nm]))
            flag = True
    if not flag:
        print('不存在此人')


def menu():
    print('0:退出')
    print('1:增加')
    print('2:删除')
    print('3:修改')
    print('4:查询')
    print('5:加载')
    print('6:保存')
    print('7:所有联系人')


def quit_system():
    print('退出成功!')


def save():
    f = open('contacts.dat','wb')
    pickle.dump(ab,f)
    f.close()
    print('保存成功')


def load():
    global ab
    f = open('contacts.dat','rb')
    ab = pickle.load(f)
    f.close()
    print('数据加载成功')


def list_all():
    for name in ab:
        print('{0}的电话号码是{1}'.format(name,ab[name]))


def main():
    load()
    while True:
        menu()
        try:
            i = int(input('输入选项'))
        except ValueError:
            print('发生异常，请重新输入')
            continue
        except UnboundLocalError:
            print('发生异常，请重新输入')
            continue
        if i == 0:
            quit_system()
            break
        if i == 1:
            add()
            continue
        if i == 2:
            delete()
            continue
        if i == 3:
            modify()
            continue
        if i == 4:
            search()
            continue
        if i == 5:
            load()
            continue
        if i == 6:
            save()
            continue
        if i == 7:
            list_all()
            continue


main()


